home *** CD-ROM | disk | FTP | other *** search
/ How to Get Online 1996 Spring / HOW2GON.ISO / mac / E-Mail / MacBiff ƒ / rbiff.c < prev    next >
C/C++ Source or Header  |  1994-01-22  |  4KB  |  185 lines

  1.  
  2.  
  3.  
  4. /*
  5.  
  6.     "rbiff" program, by Jay Kreibich and SigSoft of ACM@UIUC.
  7.     For use with the programs MacBiff, and (maybe some year)
  8.     WinBiff.
  9.  
  10.  (C) 1994 the Student Chapter of the Association for Computing Machinery
  11.    at the University of Illinois, Urbana - Champaign and SigSoft
  12.    (the Special Interest Group for Software Development), the UIUC 
  13.    Department of Computer Science, UIUC, and most likely a bunch
  14.    of other people I don't know.
  15.    
  16.    ACM at UIUC RESERVES ALL DISTRIBUTION RIGHTS.
  17.  
  18.  
  19.     Developed on SPARCstation IPX running SunOS 4.1.2.  See MacBiff README
  20.     file for more info.
  21.  
  22. */
  23.  
  24.  
  25.  
  26.  
  27.  
  28.  
  29. #include <stdio.h>
  30. #include <string.h>
  31. #include <sys/types.h>
  32. #include <sys/socket.h>
  33. #include <netinet/in.h>
  34. #include <netdb.h>
  35. #include <pwd.h>
  36.  
  37.  
  38. #define VERSION 3
  39.  
  40. typedef struct aPacket
  41. {
  42. unsigned char        flag;
  43. unsigned char        version;
  44. unsigned char        userlen;
  45. unsigned char        tolen;
  46. unsigned char        fromlen;
  47. unsigned char        sublen;
  48. char            data[250];
  49. } udpPacket;
  50.  
  51.  
  52.  
  53. char* GetNextLine(buffer, size, theFile)
  54. char *buffer;
  55. int size;
  56. FILE *theFile;
  57. {
  58.     if(fgets(buffer, size, theFile) == NULL)
  59.         return(NULL);
  60.     if(buffer[0] != '#')
  61.     {
  62.         buffer[strlen(buffer) - 1] = '\0';
  63.         return(buffer);
  64.     }
  65.     return GetNextLine(buffer, size, theFile);
  66. }
  67.  
  68.  
  69.  
  70. int main(argc, argv)
  71. int argc;
  72. char **argv;
  73. {
  74.     udpPacket        msg;
  75.     struct sockaddr_in    name;
  76.     struct hostent        *hp;
  77.     struct passwd        *pw;
  78.     char            buff[256], subj[256],
  79.                 from[256], host[256],
  80.                 *beg, *end;
  81.     FILE            *config;
  82.     long            soc,
  83.                 index = 0;
  84.     short            nogood,
  85.                 looksub = 1,
  86.                 lookfrm = 1,
  87.                 port = 0;
  88.  
  89.  
  90.     bzero(&msg, sizeof(msg));
  91.     msg.flag = 42;
  92.     msg.version = VERSION;
  93.  
  94.     pw = getpwnam(cuserid(NULL));
  95.  
  96.     while(fgets(buff, 256, stdin) != NULL)
  97.     {
  98.         if(lookfrm)
  99.         {
  100.             if(strncmp("From: ", buff, 6) == 0)
  101.             {
  102.                 strncpy(from, &buff[6], 50);
  103.                 lookfrm = 0;
  104.                 if(((beg = strchr(buff, '(')) != NULL)
  105.                  &&((end = strchr(buff, ')')) != NULL))
  106.                 {
  107.                     *end = 0;
  108.                     strncpy(from, beg+1, 50);
  109.                 }
  110.                 else
  111.                 {
  112.                     if((beg = strchr(from, '<')) != NULL)
  113.                         *beg = 0;
  114.                     else
  115.                         from[strlen(from)-1] = 0;
  116.                 }
  117.                 lookfrm = 0;
  118.             }
  119.         }
  120.         if(looksub)
  121.         {
  122.             if(strncmp("Subject: ", buff, 9) == 0)
  123.             {
  124.                 strncpy(subj, &buff[9], 50);
  125.                 subj[strlen(subj)-1] = 0;
  126.                 looksub = 0;
  127.             }
  128.         }
  129.     }
  130.  
  131.  
  132.     strcpy(buff, pw->pw_dir);
  133.     strcat(buff, "/.rbiffrc");
  134.     if((config = fopen(buff, "r")) == NULL)
  135.     {
  136.         fprintf(stderr, "%s: Could not open .rbiffrc file\n", argv[0]);
  137.         exit(2);
  138.     }
  139.  
  140.     if(GetNextLine(buff, 256, config) == NULL)
  141.     {
  142.         fprintf(stderr, "%s: No personal name found in .rbiffrc file\n", argv[0]);
  143.         exit(2);
  144.     }
  145.     msg.userlen = strlen(buff);
  146.     memccpy(&msg.data[index], buff, '\0', 50);
  147.     index += msg.userlen + 1;
  148.  
  149.     if(GetNextLine(buff, 256, config) == NULL)
  150.     {
  151.         fprintf(stderr, "%s: No account name found in .rbiffrc file\n", argv[0]);
  152.         exit(2);
  153.     }
  154.     msg.tolen = strlen(buff);
  155.     memccpy(&msg.data[index], buff, '\0', 50);
  156.     index += msg.tolen + 1;
  157.  
  158.     msg.fromlen = strlen(from);
  159.     memccpy(&msg.data[index], from, '\0', 50);
  160.     index += msg.fromlen + 1;
  161.  
  162.     msg.sublen = strlen(subj);
  163.     memccpy(&msg.data[index], subj, '\0', 50);
  164.     index += msg.sublen + 1;
  165.  
  166.     index += 6;
  167.  
  168.     soc = socket(AF_INET, SOCK_DGRAM,0);
  169.     name.sin_family = AF_INET;
  170.     while(GetNextLine(buff, 256, config) != NULL)
  171.     {
  172.         nogood = sscanf(buff, "%s %hd", host, &port);
  173.         if(nogood > 1)
  174.             name.sin_port = htons(port);
  175.         else
  176.             name.sin_port = htons(4545);
  177.         hp = gethostbyname(host);
  178.         memcpy(&name.sin_addr.s_addr, hp->h_addr_list[0], hp->h_length);
  179.         connect(soc, &name, sizeof(name));
  180.         write(soc, &msg, index);
  181.     }
  182.     fclose(config);
  183.     return 0;
  184. }
  185.